home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 2.toast / pc / sample code / quicktime / capturing / hacktv / mac / main.c < prev   
Encoding:
Text File  |  2000-09-28  |  10.6 KB  |  531 lines

  1. /*
  2.     File:        HackTV.c
  3.  
  4.     Contains:    Hack TV routines.
  5.             
  6.                 Refer to develop Issue 14, "Video Digitizing Under QuickTime",
  7.                 for details on this code.
  8.                 
  9.     Written by:    Gary Woodcock
  10.     Updated by: Brian Friedkin
  11.  
  12.     Copyright:    © 1992-1998 by Apple Computer, Inc.
  13. */
  14.  
  15. //-----------------------------------------------------------------------
  16. // Includes
  17. #include <QTML.h>
  18. #include <Menus.h>
  19. #include <MacWindows.h>
  20. #include <QuickDraw.h>
  21. #include <Resources.h>
  22. #include <Fonts.h>
  23. #include <ToolUtils.h>
  24. #include <QuickTimeComponents.h>
  25. #include <Scrap.h>
  26. #include <Printing.h>
  27. #include <Errors.h>
  28. #include <Folders.h>
  29. #include <Script.h>
  30. #include <MacMemory.h>
  31. #include <Gestalt.h>
  32. #include <Endian.h>
  33. #include <Devices.h>
  34. #include <LowMem.h>
  35. #include <TextUtils.h>
  36. #include "Globals.h"
  37. #include "Common.h"
  38.  
  39. #define kMenuBarID 128
  40. enum
  41. {
  42.     kAppleID = 128,
  43.     kFileID,
  44.     kEditID,
  45.     kMonitorID
  46. };
  47.     
  48. // Apple menu items
  49. enum
  50. {
  51.     kAboutItem = 1
  52. };
  53.  
  54. // File menu items
  55. enum
  56. {
  57.     kPageSetupItem = 1,
  58.     kPrintItem,
  59.     kQuitItem = 4
  60. };
  61.  
  62. // Edit menu items
  63. enum
  64. {
  65.     kUndoItem = 1,
  66.     kCutItem = 3,
  67.     kCopyItem,
  68.     kPasteItem,
  69.     kClearItem
  70. };
  71.  
  72. // Monitor menu items
  73. enum
  74. {
  75.     kVideoSettingsItem = 1,
  76.     kSoundSettingsItem,
  77.     kRecordVideoItem = 4,
  78.     kRecordSoundItem,
  79.     kSplitTracksItem,
  80.     kQuarterSizeItem = 8,
  81.     kHalfSizeItem,
  82.     kFullSizeItem,
  83.     kRecordItem = 12
  84. };
  85.     
  86. //-----------------------------------------------------------------------
  87. // Globals
  88. MenuHandle                gAppleMenu=0;
  89. MenuHandle                gFileMenu=0;
  90. MenuHandle                gEditMenu=0;
  91. MenuHandle                gMonitorMenu=0;
  92. EventRecord                gTheEvent;
  93.  
  94. //-----------------------------------------------------------------------
  95. // Prototypes
  96. static void Initialize (void);
  97. static void DoMenuSetup (void);
  98. static void HandleEvent (void);
  99. static void HandleMouseDown    (void);
  100. static void AdjustMenus (void);
  101. static void Enable (Handle menu, short item, Boolean ok);
  102. static void HandleMenu (long menu);
  103. static void DoQuit (void);
  104.  
  105.  
  106. //-----------------------------------------------------------------------
  107.  
  108. void main (void)
  109. {
  110.     Initialize();
  111.  
  112.     // Eat events until done
  113.     do
  114.     {
  115.         HandleEvent();
  116.     }
  117.     while (!gQuitFlag);
  118. }
  119.  
  120. //-----------------------------------------------------------------------
  121.  
  122. void Initialize(void)
  123. {
  124.     EventRecord event;
  125.     short    count;
  126.  
  127.     // Stock initialization
  128.     InitGraf((Ptr) &qd.thePort);
  129.     InitFonts();
  130.     InitWindows();
  131.     InitMenus();
  132.     TEInit();
  133.     InitDialogs(nil);
  134.     InitCursor();
  135.     MaxApplZone();
  136.     for (count = 1; count <= 3; count++)
  137.         EventAvail(everyEvent, &event);
  138.  
  139.     // Load the menubar
  140.     DoMenuSetup();
  141.  
  142.     // Initialize QuickTime
  143.     EnterMovies();
  144.     
  145.     // Startup the sequence grabber
  146.     InitializeSequenceGrabber();
  147. }
  148.  
  149. //-----------------------------------------------------------------------
  150.  
  151. void CreateMonitorWindow(void)
  152. {
  153.     gMonitor = GetNewDialog (kMonitorDLOGID, nil, (WindowPtr) -1L);
  154. }
  155.  
  156. //-----------------------------------------------------------------------
  157.  
  158. static void
  159. DoMenuSetup (void)
  160. {    
  161.     Handle    theMenuBar = GetNewMBar (kMenuBarID);
  162.     
  163.     // Set up our menus
  164.     SetMenuBar (theMenuBar);
  165.     gAppleMenu = GetMenuHandle (kAppleID);
  166.     gFileMenu = GetMenuHandle (kFileID);
  167.     gEditMenu = GetMenuHandle (kEditID);
  168.     gMonitorMenu = GetMenuHandle (kMonitorID);
  169.     AppendResMenu (gAppleMenu, 'DRVR');
  170.     
  171.     // Last minute adjustments…
  172.     AdjustMenus();
  173. }
  174.  
  175. //-----------------------------------------------------------------------
  176.  
  177. static void
  178. HandleEvent (void)
  179. {
  180.     ComponentResult    result = noErr;
  181.  
  182.     // Do system stuff
  183.     HiliteMenu(0);
  184.     SystemTask();
  185.     
  186.     // Give some time to the sequence grabber
  187.     if (gSeqGrabber != 0L)
  188.         result = SGIdle (gSeqGrabber);
  189.     
  190.     // Suck an event
  191.     if (WaitNextEvent (everyEvent, &gTheEvent, 0, 0))
  192.     {
  193.         // What was it?
  194.         switch (gTheEvent.what)
  195.         {
  196.             case mouseDown:
  197.             {
  198.                 // Handle it
  199.                 HandleMouseDown();
  200.                 break;
  201.             }
  202.             case keyDown:
  203.             case autoKey:
  204.             {
  205.                 char    theChar = gTheEvent.message & charCodeMask;
  206.                 long    theMenu = MenuKey (theChar);
  207.  
  208.                 // Handle menu command keys
  209.                 HandleMenu(theMenu);                
  210.                 break;
  211.             }
  212.             case updateEvt:
  213.             {
  214.                 if ((gMonitor != nil) && ((WindowPtr) (gTheEvent.message) == (WindowPtr) gMonitor))
  215.                 {
  216.                     SGUpdate(gSeqGrabber, ((WindowPeek)gMonitor)->updateRgn);
  217.                     BeginUpdate (gMonitor);
  218.                     EndUpdate (gMonitor);
  219.                 }
  220.                 break;
  221.             }
  222.             default:    // We don't really care about any other events, but you might, so feel free
  223.             {
  224.                 break;
  225.             }
  226.         }
  227.     }
  228. }
  229.  
  230. //-----------------------------------------------------------------------
  231.  
  232. static void
  233. HandleMouseDown (void)
  234. {    
  235.     WindowPtr    theWindow;
  236.     short        windowCode = MacFindWindow (gTheEvent.where, &theWindow);
  237.     
  238.     // Where was the mouse down?
  239.     switch (windowCode)
  240.     {
  241.         case inSysWindow:
  242.         { 
  243.             SystemClick (&gTheEvent, theWindow);
  244.             break;
  245.         }
  246.         case inMenuBar:
  247.         {
  248.             AdjustMenus();
  249.             HandleMenu (0L);
  250.             break;
  251.         }
  252.         case inDrag:
  253.         {
  254.             // Was it the monitor?
  255.             if (theWindow == gMonitor)
  256.             {
  257.                 ComponentResult    result = noErr;
  258.                 Rect            limitRect;
  259.                 RgnHandle        grayRgn = GetGrayRgn();
  260.                 Rect            boundsRect;
  261.                 
  262.                 // Find bounds
  263.                 if (grayRgn != nil)
  264.                 {
  265.                     limitRect = (*grayRgn)->rgnBBox;
  266.                 }
  267.                 else
  268.                 {
  269.                     limitRect = qd.screenBits.bounds;
  270.                 }
  271.                 
  272.                 // Pause the sequence grabber
  273.                 result = SGPause (gSeqGrabber, true);
  274.                 
  275.                 if (gVideoChannel != nil)
  276.                 {
  277.                     // Drag it with the totally cool DragAlignedWindow
  278.                       result = SGGetChannelBounds (gVideoChannel, &boundsRect);
  279.                     DragAlignedWindow (theWindow, gTheEvent.where, &limitRect, &boundsRect, &gSeqGrabberAlignProc);
  280.                 }
  281.                 else
  282.                 {
  283.                     DragWindow (theWindow, gTheEvent.where, &limitRect);
  284.                 }
  285.                 
  286.                 // Start up the sequence grabber
  287.                 result = SGPause (gSeqGrabber, false);
  288.             }
  289.             break;
  290.         }
  291.  
  292.         case inGoAway:
  293.               if (TrackGoAway(theWindow, gTheEvent.where))
  294.                 DoQuit();
  295.             break;
  296.  
  297.         default:
  298.         {
  299.             break;
  300.         }
  301.     }
  302. }
  303.  
  304. //-----------------------------------------------------------------------
  305.  
  306. static void
  307. AdjustMenus (void)
  308. {
  309.     register WindowPeek        wp = nil;
  310.     short                    kind = 0;
  311.     Boolean                    DA = false;
  312.     ComponentResult            result = noErr;
  313.     
  314.     // What kind of window is frontmost?
  315.     wp = (WindowPeek) FrontWindow();
  316.     kind = wp ? wp->windowKind : 0;
  317.     DA = kind < 0;
  318.     
  319.     // Set our menu item states appropriately
  320.     
  321.     // Apple menu
  322.     Enable ((Handle) gAppleMenu, kAboutItem, true);    
  323.     
  324.     // File menu
  325.     Enable ((Handle) gFileMenu, kPageSetupItem, true);
  326.     Enable ((Handle) gFileMenu, kPrintItem, (gVideoChannel != 0L ? true : false));
  327.     Enable ((Handle) gFileMenu, kQuitItem, true);
  328.  
  329.     // Edit menu
  330.     Enable ((Handle) gEditMenu, kUndoItem, DA);
  331.     Enable ((Handle) gEditMenu, kCutItem, DA || (gVideoChannel != 0L));
  332.     Enable ((Handle) gEditMenu, kCopyItem, DA || (gVideoChannel != 0L));
  333.     Enable ((Handle) gEditMenu, kPasteItem, DA);
  334.     Enable ((Handle) gEditMenu, kClearItem, DA);
  335.     
  336.     // Monitor menu
  337.     Enable ((Handle) gMonitorMenu, kVideoSettingsItem, (gVideoChannel != 0L ? true : false));
  338.     Enable ((Handle) gMonitorMenu, kSoundSettingsItem, (gSoundChannel != 0L ? true : false));
  339.  
  340.     Enable ((Handle) gMonitorMenu, kRecordVideoItem, (gVideoChannel != 0L ? true : false));
  341.     CheckItem (gMonitorMenu, kRecordVideoItem, (gVideoChannel && gRecordVideo)? true : false );
  342.     Enable ((Handle) gMonitorMenu, kRecordSoundItem, (gSoundChannel != 0L ? true : false));
  343.     CheckItem (gMonitorMenu, kRecordSoundItem, (gSoundChannel && gRecordSound)? true : false );
  344.      Enable ((Handle) gMonitorMenu, kSplitTracksItem, (gSoundChannel && gRecordSound && gVideoChannel && gRecordVideo)? true : false);
  345.      CheckItem (gMonitorMenu, kSplitTracksItem, gSplitTracks ? true : false);
  346.  
  347.     Enable ((Handle) gMonitorMenu, kQuarterSizeItem, (gVideoChannel != 0L ? true : false));
  348.     CheckItem (gMonitorMenu, kQuarterSizeItem, gQuarterSize);
  349.     Enable ((Handle) gMonitorMenu, kHalfSizeItem, (gVideoChannel != 0L ? true : false));
  350.     CheckItem (gMonitorMenu, kHalfSizeItem, gHalfSize);
  351.     Enable ((Handle) gMonitorMenu, kFullSizeItem, (gVideoChannel != 0L ? true : false));
  352.     CheckItem (gMonitorMenu, kFullSizeItem, gFullSize);
  353.     Enable ((Handle) gMonitorMenu, kRecordItem, ((gSoundChannel && gRecordSound) || (gVideoChannel && gRecordVideo) ? true : false));
  354.     
  355.     // Draw it
  356.     MacDrawMenuBar();
  357. }
  358.  
  359. //-----------------------------------------------------------------------
  360.  
  361. static void
  362. Enable (Handle menu, short item, Boolean ok)
  363. {
  364.     // Utility routine to enable and disable menu items
  365.     if (ok)
  366.     {
  367.         EnableItem ((MenuHandle) menu, item);
  368.     }
  369.     else
  370.     {
  371.         DisableItem ((MenuHandle) menu, item);
  372.     }
  373. }
  374.  
  375. //-----------------------------------------------------------------------
  376.  
  377. static void
  378. HandleMenu (long theMenu)
  379. {    
  380.     long            mSelect;
  381.     short            menuID;
  382.     short            menuItem;
  383.     ComponentResult    result = noErr;    
  384.     
  385.     // Did we get a menu?
  386.     if (theMenu == 0L)
  387.     {
  388.         // Nope, get it from menu select
  389.         mSelect = MenuSelect (gTheEvent.where);
  390.     }
  391.     else
  392.     {
  393.         // Yep, use it
  394.         mSelect = theMenu;
  395.     }
  396.     
  397.     // Decode it
  398.     menuID = HiWord (mSelect);
  399.     menuItem = LoWord (mSelect);
  400.     
  401.     // Which menu is it?
  402.     switch (menuID)
  403.     {
  404.         case kAppleID:
  405.         {
  406.             if (menuItem == kAboutItem)
  407.             {
  408.                 // Do the boring about box
  409.                 DoAboutDialog();
  410.             }
  411.             else    // It's a DA
  412.             {
  413.                 Str255    name;
  414.                 GrafPtr    savedPort;
  415.                 
  416.                 // Open the DA
  417.                 GetPort (&savedPort);
  418.                 GetMenuItemText (gAppleMenu, menuItem, name);
  419.                 OpenDeskAcc (name);
  420.                 SetPort (savedPort);
  421.             }
  422.             break;
  423.         }
  424.         case kFileID:
  425.         {
  426.             switch (menuItem)
  427.             {
  428.                 case kPageSetupItem:
  429.                     DoPageSetup();
  430.                     break;
  431.  
  432.                 case kPrintItem:
  433.                     DoPrint();
  434.                     break;
  435.                     
  436.                 case kQuitItem:
  437.                     DoQuit();
  438.                     break;
  439.             }
  440.             break;
  441.         }
  442.         case kEditID:
  443.         {
  444.             // Is this a DA kind of thing?
  445.             if (!SystemEdit (menuItem - 1))
  446.             {
  447.                 // We only do cut and copy
  448.                 if ((menuItem == kCutItem) || (menuItem == kCopyItem))
  449.                     DoCopyToClipboard();
  450.             }
  451.             break;
  452.         }
  453.         case kMonitorID:
  454.         {
  455.             switch (menuItem)
  456.             {
  457.                 case kVideoSettingsItem:
  458.                     DoVideoSettings();
  459.                     break;
  460.  
  461.                 case kSoundSettingsItem:
  462.                     DoSoundSettings();
  463.                     break;
  464.  
  465.                 case kRecordVideoItem:
  466.                     gRecordVideo = !gRecordVideo;
  467.                     AdjustMenus();
  468.                     break;
  469.  
  470.                 case kRecordSoundItem:
  471.                     gRecordSound = !gRecordSound;
  472.                     AdjustMenus();
  473.                     break;
  474.  
  475.                 case kSplitTracksItem:
  476.                     gSplitTracks = !gSplitTracks;
  477.                     AdjustMenus();
  478.                     break;
  479.  
  480.                 case kQuarterSizeItem:
  481.                     DoResize(4);
  482.                     break;
  483.  
  484.                 case kHalfSizeItem:
  485.                     DoResize(2);
  486.                     break;
  487.                     
  488.                 case kFullSizeItem:
  489.                     DoResize(1);
  490.                     break;
  491.                     
  492.                 case kRecordItem:
  493.                     DoRecord();
  494.                     break;
  495.  
  496.                 default:
  497.                     break;
  498.             }
  499.         }
  500.         default:
  501.             break;
  502.     }
  503. }
  504.  
  505. //-----------------------------------------------------------------------
  506.  
  507. static void
  508. DoQuit (void)
  509. {
  510.     ComponentResult    result = noErr;
  511.     
  512.     // Clean up
  513.     if (gSeqGrabber != 0L)
  514.     {
  515.         result = CloseComponent (gSeqGrabber);
  516.         gSeqGrabber = 0L;
  517.     }    
  518.     
  519.     if (gMonitor != nil)
  520.     {
  521.         DisposeWindow(gMonitor);
  522.     }
  523.     
  524.     // Set quit flag
  525.     gQuitFlag = true;
  526.     
  527.     ExitMovies();
  528. }
  529.  
  530. //-----------------------------------------------------------------------
  531.